package fitnesse.wikitext.widgets; import hudson.maven.MavenEmbedderException; import hudson.maven.MavenRequest; import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectBuildingResult; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import java.io.File; import java.util.List; /** * Utiity class to extract classpath elements from Maven projects. Heavily based on code copied from Jenkin's Maven * support. */ public class MavenClasspathExtractor { public final static String DEFAULT_SCOPE = "test"; private File userSettingsFile; private File globalSettingsFile; public List<String> extractClasspathEntries(File pomFile) { return extractClasspathEntries(pomFile, DEFAULT_SCOPE); } public List<String> extractClasspathEntries(File pomFile, String scope) throws MavenClasspathExtractionException { try { MavenRequest mavenRequest = mavenConfiguration(); mavenRequest.setResolveDependencies(true); mavenRequest.setBaseDirectory(pomFile.getParent()); mavenRequest.setPom(pomFile.getAbsolutePath()); DependencyResolvingMavenEmbedder dependencyResolvingMavenEmbedder = new DependencyResolvingMavenEmbedder(getClass().getClassLoader(), mavenRequest); ProjectBuildingResult projectBuildingResult = dependencyResolvingMavenEmbedder.buildProject(pomFile); return getClasspathForScope(projectBuildingResult, scope); } catch (MavenEmbedderException mee) { throw new MavenClasspathExtractionException(mee); } catch (ComponentLookupException cle) { throw new MavenClasspathExtractionException(cle); } catch (DependencyResolutionRequiredException e) { throw new MavenClasspathExtractionException(e); } catch (ProjectBuildingException e) { throw new MavenClasspathExtractionException(e); } } private List<String> getClasspathForScope( ProjectBuildingResult projectBuildingResult, String scope) throws DependencyResolutionRequiredException { MavenProject project = projectBuildingResult.getProject(); if ("compile".equalsIgnoreCase(scope)) { return project.getCompileClasspathElements(); } else if ("runtime".equalsIgnoreCase(scope)) { return project.getRuntimeClasspathElements(); } return project.getTestClasspathElements(); } // protected for test purposes protected MavenRequest mavenConfiguration() throws MavenEmbedderException, ComponentLookupException { MavenRequest mavenRequest = new MavenRequest(); if (userSettingsFile != null && userSettingsFile.exists()) { mavenRequest.setUserSettingsFile(userSettingsFile.getAbsolutePath()); } if (globalSettingsFile != null && globalSettingsFile.exists()) { mavenRequest.setGlobalSettingsFile(globalSettingsFile.getAbsolutePath()); } DependencyResolvingMavenEmbedder mavenEmbedder = new DependencyResolvingMavenEmbedder(MavenClasspathExtractor.class.getClassLoader(), mavenRequest); mavenEmbedder.getMavenRequest().setLocalRepositoryPath(getLocalRepository(mavenEmbedder.getSettings().getLocalRepository())); return mavenEmbedder.getMavenRequest(); } /* * can be overridden for test purposes. */ protected String getLocalRepository(String localRepository) { return localRepository; } // protected for test purposes protected void setMavenUserSettingsFile(File userSettingsFile) { this.userSettingsFile = userSettingsFile; } // protected for test purposes protected void setMavenGlobalSettingsFile(File globalSettingsFile) { this.globalSettingsFile = globalSettingsFile; } }